{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "a688840a",
   "metadata": {},
   "source": [
    "# DAY30\n",
    "注意今天的文件有2个 day30.ipynb 和 day30.py"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0143f324",
   "metadata": {},
   "source": [
    "## 一、导入官方库\n",
    "\n",
    "我们复盘下学习python的逻辑，所谓学习python就是学习python常见的基础语法+学习你所处理任务需要用到的第三方库\n",
    "\n",
    "\n",
    "\n",
    "| **类别**       | **典型库**                | **解决的问题**                                                                 | **学习门槛** |\n",
    "|----------------|---------------------------|---------------------------------------------------------------------------------|--------------|\n",
    "| **基础工具**   | `os`、`sys`、`json`        | 操作系统交互、序列化数据（如读写 JSON 文件）                                    | 低           |\n",
    "| **科学计算**   | `numpy`、`scipy`           | 数值计算、线性代数、信号处理                                                  | 中           |\n",
    "| **数据分析**   | `pandas`、`matplotlib`      | 数据清洗、转换、可视化（如绘制折线图、柱状图）                                  | 中           |\n",
    "| **Web 开发**   | `Django`、`Flask`          | 快速搭建 Web 应用（如网站后台、API 接口）                                       | 中高         |\n",
    "| **机器学习**   | `scikit-learn`、`TensorFlow` | 机器学习算法（分类、回归、深度学习）                                            | 高           |\n",
    "| **自动化脚本** | `pyautogui`、`pytest`       | 自动化测试、桌面操作自动化（如模拟鼠标键盘操作）                                | 低           |\n",
    "| **网络爬虫**   | `requests`、`Scrapy`        | 从网页提取数据（需注意反爬机制和法律合规）                                      | 中           |\n",
    "\n",
    "\n",
    "所以你用到什么学什么库即可。学习python本身就是个伪命题，就像你说学习科目一样，你没说清晰你学习的具体科目是什么，也没说学这个科目的哪些章节，毕竟每个科目都很大-----要有以终为始的思想。\n",
    "\n",
    "所以我们这个训练营，正确的说法是：学习借助pythob掌握深度学习和机器学习所必备的基础知识和相关工具。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "33a6b48b",
   "metadata": {},
   "source": [
    "### 1.1 标准导入：导入整个库\n",
    "\n",
    "这是最基本也是最常见的导入方式，直接使用`import`语句。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "4fea1eee",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "方式1：使用 import math\n",
      "圆周率π的值：3.141592653589793\n",
      "2的平方根：1.4142135623730951\n",
      "\n"
     ]
    }
   ],
   "source": [
    "# 方式1：导入整个模块\n",
    "import math\n",
    "\n",
    "print(\"方式1：使用 import math\")\n",
    "print(f\"圆周率π的值：{math.pi}\")\n",
    "print(f\"2的平方根：{math.sqrt(2)}\\n\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "166691cb",
   "metadata": {},
   "source": [
    "### 1.2 从库中导入特定项\n",
    "\n",
    "当使用from语法从库中导入特定的函数或类时，这些函数或类就可以在您的代码中直接使用，不需要添加模块名作为前缀。因为在导入时没有包括模块的完整路径，前面也不能加上库名。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "d02a127c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "方式2：使用 from math import pi, sqrt\n",
      "圆周率π的值：3.141592653589793\n",
      "2的平方根：1.4142135623730951\n",
      "\n"
     ]
    }
   ],
   "source": [
    "# 方式2：导入特定的函数或变量\n",
    "from math import pi, sqrt\n",
    "\n",
    "print(\"方式2：使用 from math import pi, sqrt\")\n",
    "print(f\"圆周率π的值：{pi}\")\n",
    "print(f\"2的平方根：{sqrt(2)}\\n\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "32082a16",
   "metadata": {},
   "source": [
    "类似的写法，如sklearn库很大，直接导入sklearn库会占用电脑大量内存，所以一般只导入你需要的库，\n",
    "- 如： from sklearn.model_selection import train_test_split"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9de89440",
   "metadata": {},
   "source": [
    "### 1.3 非标准导入：导入整个库\n",
    "\n",
    "如下，●这将导入`math`模块中定义的所有公开函数和变量。\n",
    "●和上述from同理，直接调用`sin()`、`cos()`等，而无需`math.`前缀。\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3aa248da",
   "metadata": {},
   "source": [
    "虽然 import math和 from math import *看起来都是导入了 `math` 模块，但它们在导入方式、作用域处理以及对命名空间的影响上有重要的区别。\n",
    "1. 命名空间的污染\n",
    " `import math`：这种方法会将整个 `math` 模块导入到命名空间中，但是需要使用 `math.` 前缀来访问模块内的函数或变量。这种方式保持了命名空间的整洁，因为所有的 `math` 函数和变量都包含在 `math` 这个模块对象中。\n",
    " `from math import *`：这种方法将 `math` 模块中的所有公开的函数和变量导入到当前的命名空间中，可以直接使用这些函数和变量而无需 `math.` 前缀。这种方式可能会导致命名空间污染，特别是当有多个模块都被这样导入时，很容易发生命名冲突。\n",
    "\n",
    "2. 明确性和可维护性\n",
    " `import math`：明确指出了函数和变量来源于 `math` 模块，这对代码的可读性和维护性都是有益的。其他阅读你代码的人可以清楚地看到每个函数的来源，这对大型项目和团队合作尤为重要。\n",
    " `from math import *`：虽然代码看起来更简洁，但这种方法减少了代码的明确性。如果没有足够的上下文，很难判断一个特定的函数是来自 `math` 模块还是其他模块，尤其是当你导入了多个模块时。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "3c4e36d8",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "圆周率π的值：3.141592653589793\n",
      "2的平方根：1.4142135623730951\n"
     ]
    }
   ],
   "source": [
    "from math import *\n",
    "\n",
    "print(f\"圆周率π的值：{pi}\")\n",
    "print(f\"2的平方根：{sqrt(2)}\")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "aa4dca46",
   "metadata": {},
   "source": [
    "上述这些，如果是python内置库，可以直接导入，大部分第三方库都需要先用pip来安装。下面的模块，也就是.py文件，是不需要安装即可调用的。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b6b81c61",
   "metadata": {},
   "source": [
    "## 模块、包的定义"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "49531eee",
   "metadata": {},
   "source": [
    "模块（Module）\n",
    "\n",
    "- **本质**：以 `.py` 结尾的**单个文件**，包含Python代码（函数、类、变量等）。\n",
    "- **作用**：将代码拆分到不同文件中，避免代码冗余，方便复用和维护。\n",
    "\n",
    "包（Package）\n",
    "\n",
    "在python里，包就是库\n",
    "\n",
    "\n",
    "- **本质**：**有层次的文件目录结构**（即文件夹），用于组织多个模块和子包。\n",
    "- **核心特征**：包的根目录下必须包含一个 `__init__.py` 文件（可以为空），用于标识该目录是一个包。\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1cf247bd",
   "metadata": {},
   "source": [
    "## 使用案例"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5cf39177",
   "metadata": {},
   "source": [
    "若编写一个计算圆面积的代码并保存为 `circle.py`，这个文件就是一个模块。\n",
    "\n",
    "使用时通过 `import circle` 导入模块，调用其中的函数（如 `circle.calculate_area(5)`）。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "d3d84e80",
   "metadata": {},
   "outputs": [],
   "source": [
    "# circle.py\n",
    "import math\n",
    "\n",
    "def calculate_area(radius):\n",
    "    return math.pi * radius ** 2"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "98db8a31",
   "metadata": {},
   "source": [
    "IDE（如 VSCode 或 PyCharm）通常会将你打开的项目文件夹设为“根目录”（或者说，运行时的工作目录）。Python 在导入模块时，会从这个根目录（以及其他一些标准位置和脚本所在的目录）开始查找。\n",
    "\n",
    "\n",
    "#### 场景1: `main.py` 和 `circle.py` 都在同一目录\n",
    "\n",
    "**目录结构:**\n",
    "\n",
    "```\n",
    "项目根目录/\n",
    "├── main.py\n",
    "└── circle.py\n",
    "```\n",
    "\n",
    "**`main.py` 内容:**\n",
    "\n",
    "```python\n",
    "# main.py\n",
    "from circle import calculate_area\n",
    "# 或者: import circle (然后用 circle.calculate_area)\n",
    "\n",
    "radius = 5\n",
    "area = calculate_area(radius)\n",
    "print(f\"半径为 {radius} 的圆，面积是: {area}\")\n",
    "```\n",
    "\n",
    "-----\n",
    "运行方案：直接在终端python main.py\n",
    "\n",
    "这里的终端可以通过左上角的查看-终端 打卡，默认的路径是你的项目根目录。\n",
    "\n",
    "#### 场景2: `main.py` 和 `circle.py` 都在根目录的子目录 `model/` 下\n",
    "\n",
    "**目录结构:**\n",
    "\n",
    "```\n",
    "项目根目录/\n",
    "└── model/\n",
    "    ├── __init__.py   (推荐添加，将 model 目录标记为包)\n",
    "    ├── main.py\n",
    "    └── circle.py\n",
    "```\n",
    "\n",
    "**`model/main.py` 内容:**\n",
    "\n",
    "```python\n",
    "# model/main.py\n",
    "from circle import calculate_area\n",
    "# 或者: import circle (然后用 circle.calculate_area)\n",
    "\n",
    "radius = 5\n",
    "area = calculate_area(radius)\n",
    "print(f\"半径为 {radius} 的圆，面积是: {area}\")\n",
    "```\n",
    "\n",
    "运行方案：\n",
    "1. 运行命令：python model/main.py\n",
    "2. 进入路径：cd xxx（main的相对路径），然后执行python main.py\n",
    "（注意如果先cd后，就不能采用第一个命令了）\n",
    "\n",
    "-----\n",
    "\n",
    "#### 场景3: `main.py` 在根目录，`circle.py` 在子目录 `model/` 下\n",
    "\n",
    "**目录结构:**\n",
    "\n",
    "```\n",
    "项目根目录/\n",
    "├── main.py\n",
    "└── model/\n",
    "    ├── __init__.py   (必需添加，将 model 目录标记为一个可导入的包)\n",
    "    └── circle.py\n",
    "```\n",
    "\n",
    "**`main.py` 内容:**\n",
    "\n",
    "```python\n",
    "# main.py\n",
    "from model.circle import calculate_area\n",
    "# 或者: from model import circle (然后用 circle.calculate_area，因为此时你是导入了整个模块)\n",
    "\n",
    "radius = 5\n",
    "area = calculate_area(radius)\n",
    "print(f\"半径为 {radius} 的圆，面积是: {area}\")\n",
    "```\n",
    "运行方案：直接在终端python main.py\n",
    "\n",
    "# 场景3\n",
    "```\n",
    "项目根目录/\n",
    "├── circle2.py\n",
    "└── utils/\n",
    "    ├── __init__.py   (必需添加，将 model 目录标记为一个可导入的包)\n",
    "    └── circle.py\n",
    "└── model/\n",
    "    └── main.py\n",
    "\n",
    "```\n",
    "运行方式\n",
    "python -m model.main\n",
    "\n",
    "\n",
    "如果直接使用python model/main.py，会报错，\n",
    "当使用 python -m model.main 时，Python 会将当前目录（即项目根目录）添加到 sys.path 的开头。\n",
    "\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2c4cffbd",
   "metadata": {},
   "source": [
    "## 三、源代码的查看"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "99d65461",
   "metadata": {},
   "source": [
    "如果第三方库是纯python写的，往往在函数上按住ctrl即可进入函数内部查看源代码。\n",
    "但是很多第三方库为了性能，底层是用其他语言写的，这里我们计算机视觉库OpenCV为例。\n",
    "OpenCV核心是用C++编写的（C++可以显著提高性能），但它通过Python等其他语言的接口（bindings）使得这些功能可以在Python环境中被调用。这些接口是通过一种叫做Python/C API的技术实现的，其中C++的功能被封装成Python模块，使得Python用户可以像使用纯Python编写的库一样使用OpenCV。\n",
    "OpenCV的核心是用C++编写，并且已经编译成二进制文件，编译后的二进制文件可以在不同操作系统上运行，Python中的用户通常不能直接看到方法的源代码。\n",
    "\n",
    "\n",
    "二进制文件是机器语言，处理器可以直接理解和执行无需翻译，二进制语言反汇编是很困难的，用二进制语言除了效果好外，也是让用户无法看到源代码，保护了自己的知识产权。\n",
    "\n",
    "这意味着：\n",
    "●二进制文件dll文件：当你在Python中导入OpenCV库（通import cv2），你实际上是在调用预先编译好的二进制文件。这些文件包含了实现OpenCV功能的可执行代码，而非人类可读的源代码。\n",
    "●接口封装：用户只能看到Python函数和对象的接口（即函数的定义，不包括实现的细节）。这也意味着无法从利用ctrl跳转到函数内部，pycharm的debugger功能同理也无法看到内部结构。\n",
    "●文档和源代码：尽管在Python中不能直接看到C++的源代码实现，用户可以参考官方文档来了解各个函数和方法的用法。如果需要查看实现细节，可以访问OpenCV的[GitHub仓库](https://github.com/opencv/opencv)查看C++源代码。\n",
    "\n",
    "这就需要我们养成看文档的能力，文档就是以终为始思想的体现。文档就是api使用说明书，可能你日常买东西都不喜欢看使用说明书，但是在代码学习中，这一步是绕不开的。\n",
    "你会发现很多B站视频的教学，其实远不如文档说明书细致。\n",
    "\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "vs",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.18"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
